from datetime import datetime
from typing import List

from pydantic import BaseModel, Field

from app.schemas.enums import WeatherEnum


class CreateWeatherRequestSchema(BaseModel):
    regionId: int = Field(description="Идентификатор региона")
    temperature: float = Field(description="Температура в регионе, °C")
    humidity: float = Field(description="Влажность воздуха в регионе, %")
    windSpeed: float = Field(description="Скорость ветра, м/с")
    weatherCondition: WeatherEnum = Field(description="Текущее состояние погоды")
    precipitationAmount: float = Field(description="Количество осадков, мм")
    measurementDateTime: datetime = Field(
        description="Дата и время измерения погодных условий в формате ISO-8601"
    )
    weatherForecast: List[int] = Field(
        description="Массив идентификаторов объектов с прогнозом погоды на ближайшие дни"
    )


class EditWeatherRequestSchema(BaseModel):
    regionName: str = Field(description="Новое название региона")
    temperature: float = Field(description="Новая температура в регионе, °C")
    humidity: float = Field(description="Новая влажность воздуха в регионе, %")
    windSpeed: float = Field(description="Скорость ветра, м/с")
    weatherCondition: str = Field(description="Текущее состояние погоды")
    precipitationAmount: float = Field(description="Количество осадков, мм")
    measurementDateTime: datetime = Field(
        description="Дата и время измерения погодных условий в формате ISO-8601"
    )
    weatherForecast: List[int] = Field(
        description="Массив идентификаторов объектов с прогнозом погоды на ближайшие дни"
    )


class GetWeatherResponseSchema(BaseModel):
    id: int = Field(
        description="Уникальный идентификатор созданной записи о погоде в регионе"
    )
    temperature: float = Field(description="Температура в регионе, °C")
    humidity: float = Field(description="Влажность воздуха в регионе, %")
    windSpeed: float = Field(description="Скорость ветра, м/с")
    weatherCondition: WeatherEnum = Field(description="Текущее состояние погоды")
    precipitationAmount: float = Field(description="Количество осадков, мм")
    measurementDateTime: datetime = Field(
        description="Дата и время измерения погодных условий в формате ISO-8601"
    )
    weatherForecast: List[int] = Field(
        description="Массив идентификаторов объектов с прогнозом погоды на ближайшие дни"
    )


class GetWeatherForRegion(BaseModel):
    id: int = Field(description="Идентификатор региона")
    regionName: str = Field(description="Название региона")
    temperature: float = Field(description="Температура в регионе, °C")
    humidity: float = Field(description="Влажность воздуха в регионе, %")
    windSpeed: float = Field(description="Скорость ветра, м/с")
    weatherCondition: str = Field(description="Текущее состояние погоды")
    precipitationAmount: float = Field(description="Количество осадков, мм")
    measurementDateTime: datetime = Field(
        description="Дата и время измерения погодных условий в формате ISO-8601"
    )
    weatherForecast: List[int] = Field(
        description="Массив идентификаторов объектов с прогнозом погоды на ближайшие дни"
    )


class RegionDeleteWeatherResponse(BaseModel):
    id: int = Field(description="Идентификатор региона")
    name: str = Field(description="Название региона")
    parentRegion: str = Field(description="Название родительского региона")
    latitude: float = Field(description="Координаты широты")
    longitude: float = Field(description="Координаты долготы")


class EditWeatherRequest(BaseModel):
    regionName: str
    temperature: float
    humidity: float
    windSpeed: float
    weatherCondition: WeatherEnum
    precipitationAmount: float
    measurementDateTime: datetime
    weatherForecast: List[int]


class EditWeatherResponse(BaseModel):
    id: int
    regionId: int
    regionName: str
    temperature: float
    humidity: float
    windSpeed: float
    weatherCondition: WeatherEnum
    precipitationAmount: float
    measurementDateTime: datetime
    weatherForecast: List[int]
